From d4e34510de0cb8e61ad970913abda4ef3a43f90c Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Tue, 23 Aug 2005 09:24:46 +0000 Subject: [PATCH] Update gnttab_free_callback_list locking. Signed-off-by: Christian Limpach --- linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c index aff4da6a5e..92f5574936 100644 --- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c +++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c @@ -68,13 +68,11 @@ get_free_entry( return fh; } -static void do_free_callbacks(void) +static void do_free_callbacks(unsigned long flags) { - struct gnttab_free_callback *callback, *next; - spin_lock_irq(&gnttab_free_callback_list_lock); - callback = gnttab_free_callback_list; + struct gnttab_free_callback *callback = gnttab_free_callback_list, *next; gnttab_free_callback_list = NULL; - spin_unlock_irq(&gnttab_free_callback_list_lock); + spin_unlock_irqrestore(&gnttab_free_callback_list_lock, flags); while (callback) { next = callback->next; callback->next = NULL; @@ -88,12 +86,14 @@ put_free_entry( grant_ref_t ref) { grant_ref_t fh, nfh = gnttab_free_head; + unsigned long flags; do { gnttab_free_list[ref] = fh = nfh; wmb(); } while ( unlikely((nfh = cmpxchg(&gnttab_free_head, fh, ref)) != fh) ); - spin_lock_irq(&gnttab_free_callback_list_lock); + spin_lock_irqsave(&gnttab_free_callback_list_lock, flags); if ( unlikely(gnttab_free_callback_list) ) - do_free_callbacks(); - spin_unlock_irq(&gnttab_free_callback_list_lock); + do_free_callbacks(flags); + else + spin_unlock_irqrestore(&gnttab_free_callback_list_lock, flags); } /* @@ -276,14 +276,15 @@ void gnttab_request_free_callback(struct gnttab_free_callback *callback, void (*fn)(void *), void *arg) { + unsigned long flags; if (callback->next) return; callback->fn = fn; callback->arg = arg; - spin_lock_irq(&gnttab_free_callback_list_lock); + spin_lock_irqsave(&gnttab_free_callback_list_lock, flags); callback->next = gnttab_free_callback_list; gnttab_free_callback_list = callback; - spin_unlock_irq(&gnttab_free_callback_list_lock); + spin_unlock_irqrestore(&gnttab_free_callback_list_lock, flags); } /* -- 2.30.2